package main

import (
	"fmt"
	"math/rand"
	"time"
)

// 99乘法表
func T_Multiply() {
	for i := 1; i < 10; i++ {
		for y := 1; y <= i; y++ {
			fmt.Printf("%v * %v = %v\t", i, y, i*y)
		}
		fmt.Println()
	}
}

// 根据随机数奇偶数 做相加、相乘
// 根据i的奇偶数 做相加、相乘
func T_Random() {
	fmt.Print("当前随机数: ")
	src1 := rand.New(rand.NewSource(time.Now().UnixNano()))
	dest1 := 0
	dest2 := 1
	for i := 1; i <= 20; i++ {
		dest := src1.Intn(20) // 从1~20随机抽取20数，可能有重复
		fmt.Printf("%v ", dest)
		if dest&1 == 1 {
			dest1 += dest
		}
		if dest != 0 && dest&1 == 0 { // 防止偶数相乘为0
			dest2 *= dest
		}
	}
	fmt.Printf("根据随机数奇数相加: %d 偶数相乘: %d\n", dest1, dest2)

	fmt.Print("当前随机数: ")
	src2 := rand.New(rand.NewSource(time.Now().UnixNano()))
	dest3 := 0
	dest4 := 1
	for i := 1; i <= 20; i++ {
		dest := src2.Intn(20) // 从1~20随机抽取20数，可能有重复
		fmt.Printf("%v ", dest)
		if i&1 == 1 {
			dest3 += dest

		}
		if dest != 0 && i&1 == 0 { // 防止偶数为0
			dest4 *= dest

		}
	}
	fmt.Printf("根据i的奇数相加：%d 偶数相乘: %d\n", dest3, dest4)
}

// 打印100以内的斐波那契数列
// 斐波那契数列: 1, 1, 2, 3, 5, 8, 13, 21, ...根据规律观察发现前从第三个数开始，每个数都等于前两个之和
func T_FibonacciSequence() {
	var prefix, suffix int64
	prefix = 1
	suffix = 1
	fmt.Printf("斐波那契数列: ")
	fmt.Printf("%v %v ", prefix, suffix)
	for prefix+suffix < 100 {
		prefix, suffix = suffix, prefix+suffix
		fmt.Printf("%v ", suffix)
	}
}

func main() {
	// 99乘法表
	T_Multiply()
	// 根据随机数奇偶数 做相加、相乘
	// 根据i的奇偶数 做相加、相乘
	T_Random()
	// 打印100以内的斐波那契数列
	T_FibonacciSequence()
}
